using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._AnalysisTools._PairwiseOverlay
{
    /// <summary>
    /// <para>Pairwise Clip</para>
    /// <para>Extracts input features that overlay the clip features.</para>
    /// <para>提取叠加剪辑要素的输入要素。</para>
    /// </summary>    
    [DisplayName("Pairwise Clip")]
    public class PairwiseClip : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public PairwiseClip()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_features">
        /// <para>Input Features</para>
        /// <para>The features to be clipped.</para>
        /// <para>要裁剪的特征。</para>
        /// </param>
        /// <param name="_clip_features">
        /// <para>Clip Features</para>
        /// <para>The features to use to clip the input features.</para>
        /// <para>用于裁剪输入要素的特征。</para>
        /// </param>
        /// <param name="_out_feature_class">
        /// <para>Output Feature Class</para>
        /// <para>The feature class to be created.</para>
        /// <para>要创建的要素类。</para>
        /// </param>
        public PairwiseClip(object _in_features, object _clip_features, object _out_feature_class)
        {
            this._in_features = _in_features;
            this._clip_features = _clip_features;
            this._out_feature_class = _out_feature_class;
        }
        public override string ToolboxName => "Analysis Tools";

        public override string ToolName => "Pairwise Clip";

        public override string CallName => "analysis.PairwiseClip";

        public override List<string> AcceptEnvironments => ["MDomain", "MResolution", "MTolerance", "XYDomain", "XYResolution", "XYTolerance", "ZDomain", "ZResolution", "ZTolerance", "configKeyword", "extent", "maintainCurveSegments", "outputCoordinateSystem", "outputMFlag", "outputZFlag", "outputZValue", "parallelProcessingFactor"];

        public override object[] ParameterInfo => [_in_features, _clip_features, _out_feature_class, _cluster_tolerance];

        /// <summary>
        /// <para>Input Features</para>
        /// <para>The features to be clipped.</para>
        /// <para>要裁剪的特征。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_features { get; set; }


        /// <summary>
        /// <para>Clip Features</para>
        /// <para>The features to use to clip the input features.</para>
        /// <para>用于裁剪输入要素的特征。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Clip Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _clip_features { get; set; }


        /// <summary>
        /// <para>Output Feature Class</para>
        /// <para>The feature class to be created.</para>
        /// <para>要创建的要素类。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Feature Class")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_feature_class { get; set; }


        /// <summary>
        /// <para>XY Tolerance</para>
        /// <para><xdoc>
        ///   <para>The minimum distance separating all feature coordinates as well as the distance a coordinate can move in X or Y (or both). Set the value higher for data with less coordinate accuracy and lower for data with extremely high accuracy.</para>
        ///   <para>Changing this parameter's value may cause failure or unexpected results. It is recommended that this parameter not be modified. It has been removed from view in the tool dialog. By default, the input feature class's spatial reference x,y tolerance property is used.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>分隔所有要素坐标的最小距离以及坐标可以在 X 或 Y（或两者）中移动的距离。对于坐标精度较低的数据，将该值设置为较高，对于具有极高精度的数据，将该值设置为较低的值。</para>
        ///   <para>更改此参数的值可能会导致失败或意外结果。建议不要修改该参数。它已从工具对话框的视图中删除。默认情况下，将使用输入要素类的空间参考 x，y 容差属性。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("XY Tolerance")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public string? _cluster_tolerance { get; set; } = null;


        public PairwiseClip SetEnv(object MDomain = null, object MResolution = null, object MTolerance = null, object XYDomain = null, object XYResolution = null, object XYTolerance = null, object ZDomain = null, object ZResolution = null, object ZTolerance = null, object configKeyword = null, object extent = null, object outputCoordinateSystem = null, object outputMFlag = null, object outputZFlag = null, object outputZValue = null, object parallelProcessingFactor = null)
        {
            base.SetEnv(MDomain: MDomain, MResolution: MResolution, MTolerance: MTolerance, XYDomain: XYDomain, XYResolution: XYResolution, XYTolerance: XYTolerance, ZDomain: ZDomain, ZResolution: ZResolution, ZTolerance: ZTolerance, configKeyword: configKeyword, extent: extent, outputCoordinateSystem: outputCoordinateSystem, outputMFlag: outputMFlag, outputZFlag: outputZFlag, outputZValue: outputZValue, parallelProcessingFactor: parallelProcessingFactor);
            return this;
        }

    }

}